/*
    TypeScript 运算符
 */

/**
 * 算术运算符
 * +, -, *, /, %, ++, --
 */
var num1:number = 10;
var num2:number = 2;
var res:number = 0;

res = num1 + num2;
console.log("加:  "+res);

res = num1 - num2;
console.log("减: "+res);

res = num1*num2;
console.log("乘: "+res);

res = num1/num2;
console.log("除: "+res);

res = num1%num2;
console.log("余数: "+res);

num1++;
console.log("num1 自增运算: "+num1);

num2--;
console.log("num2 自减运算: "+num2);

/**
 * 关系运算符
 * 关系运算符用于计算结果是否为 true 或者 false。
 * ==, !=, >, <, >=, <=
 */
var num3:number = 5;
var num4:number = 9;

console.log("num1 的值为: "+num3);
console.log("num2 的值为:"+num4);

var res2 = num3>num4;
console.log("num3 大于n num4: "+res2);

res2 = num3<num4;
console.log("num3 小于 num4: "+res2);

res2 = num3>=num4;
console.log("num3 大于或等于  num4: "+res2);

res2 = num3<=num4;
console.log("num3 小于或等于 num4: "+res2);

res2 = num3==num4;
console.log("num3 等于 num4: "+res2);

res2 = num3!=num4;
console.log("num3 不等于 num4: "+res2);

/**
 * 逻辑运算符
 * 逻辑运算符用于测定变量或值之间的逻辑。
 * &&, ||, !
 */
var avg:number = 20;
var percentage:number = 90;

console.log("avg 值为: "+avg+" ,percentage 值为: "+percentage);

var res3:boolean = ((avg>50)&&(percentage>80));
console.log("(avg>50)&&(percentage>80): ",res3);

var res4:boolean = ((avg>50)||(percentage>80));
console.log("(avg>50)||(percentage>80): ",res4);

var res5:boolean=!((avg>50)&&(percentage>80));
console.log("!((avg>50)&&(percentage>80)): ",res5);

/**
 * 位运算符
 * 位操作是程序设计中对位模式按位或二进制数的一元和二元操作。
 *      &: AND，按位与处理两个长度相同的二进制数，两个相应的二进位都为 1，该位的结果值才为 1，否则为 0。
 *      |: OR，按位或处理两个长度相同的二进制数，两个相应的二进位中只要有一个为 1，该位的结果值为 1。
 *      ~: 取反，取反是一元运算符，对一个二进制数的每一位执行逻辑反操作。使数字 1 成为 0，0 成为 1。
 *      ^: 异或，按位异或运算，对等长二进制模式按位或二进制数的每一位执行逻辑异按位或操作。操作的结果是如果某位不同则该位为 1，否则该位为 0。
 *      <<: 左移，把 << 左边的运算数的各二进位全部左移若干位，由 << 右边的数指定移动的位数，高位丢弃，低位补 0。
 *      >>: 右移，把 >> 左边的运算数的各二进位全部右移若干位，>> 右边的数指定移动的位数。
 *      >>>: 无符号右移，与有符号右移位类似，除了左边一律使用0 补位。
 */
var a:number = 2;   // 二进制 10
var b:number = 3;   // 二进制 11

var result;

result = (a & b);
console.log("(a & b) => ",result);

result = (a | b);
console.log("(a | b) => ",result);

result = (a ^ b);
console.log("(a ^ b) => ",result);

result = (~b);
console.log("(~b) => ",result);

result = (a << b);
console.log("(a << b) => ",result);

result = (a >> b);
console.log("(a >> b) => ",result);

result = (a >>> 1);
console.log("(a >>> 1) => ",result);

/**
 * 赋值运算符
 * 赋值运算符用于给变量赋值。
 * =, +=, -=, *=, /=。
 * 类似的逻辑运算符也可以与赋值运算符联合使用：<<=, >>=, >>=, &=, |= 与 ^=。
 */
var a: number = 12;
var b:number = 10;

a = b;
console.log("a = b: "+a);

a += b;
console.log("a+=b: "+a);

a -= b;
console.log("a-=b: "+a);

a *= b;
console.log("a*=b: "+a);

a /= b;
console.log("a/=b: "+a);

a %= b;
console.log("a%=b: "+a);

/**
 * 三元运算符 (? : )
 * 三元运算有 3 个操作数，并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
 */
var num:number = -2;
var result2 = num > 0 ? "大于 0" : "小于 0，或等于 0";
console.log(result2);

/**
 * 类型运算符
 *      typeof 运算符,是一元运算符，返回操作数的数据类型。
 *      instanceof 运算符用于判断对象是否为指定的类型
 */
var num = 12;
console.log(typeof num);   //输出结果: number
class A {}
class B {}
var a_: A = new A();
console.log(a_ instanceof A); // true
console.log(a_ instanceof B); //false

/**
 * 其他运算符
 *      负号运算符(-):更改操作数的符号
 *      字符串运算符: 连接运算符 (+): + 运算符可以拼接两个字符串
 */
var x:number = 4;
var y = -x;
console.log("x 值为: ",x);   // 输出结果 4
console.log("y 值为: ",y);   // 输出结果 -4

var msg:string = "ryan"+"liu";
console.log(msg);